'use client' import { useState, useEffect } from 'react' import { Button } from '@/components/ui/button' import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@/components/ui/card' import { Input } from '@/components/ui/input' import { Label } from '@/components/ui/label' import { Badge } from '@/components/ui/badge' import { toast } from 'sonner' import { Loader2, Send, RefreshCw } from 'lucide-react' // CSV 필드를 정의할 타입 interface VendorFieldDef { table: string; name: string; mandatory: boolean; description: string; } // CSV 파싱 함수 (간단 파서) const parseCSV = (csv: string): VendorFieldDef[] => { const lines = csv.trim().split('\n'); // 첫 번째 라인은 헤더이므로 제거 return lines.slice(1).map((line) => { const parts = line.split(','); const table = parts[1]?.trim(); const name = parts[2]?.trim(); const mandatory = parts[3]?.trim() === 'M'; const description = parts.slice(6).join(',').trim(); return { table, name, mandatory, description } as VendorFieldDef; }); }; // 기존 샘플 기본값 (필요 시 확장) const sampleDefaults: Record = { BP_HEADER: 'TEST001', ZZSRMCD: 'EVCP', TITLE: 'TEST', BU_SORT1: 'TEST VENDOR', NAME_ORG1: '테스트 벤더 회사', KTOKK: 'Z001', VEN_KFBUS: '제조업', VEN_KFIND: 'IT', MASTERFLAG: 'X', IBND_TYPE: 'U', ZZREQID: 'TESTUSER01', ADDRNO: '0001', AD_NATION: '1', COUNTRY: 'KR', LANGU_COM: 'K', POST_COD1: '06292', CITY1: '서울시', DISTRICT: '강남구', REGION: '11', MC_STREET: '테헤란로 123', T_COUNTRY: 'KR', T_NUMBER: '02-1234-5678', F_COUNTRY: 'KR', F_NUMBER: '02-1234-5679', U_ADDRESS: 'https://test.vendor.com', E_ADDRESS: 'contact@test.vendor.com', BP_TX_TYP: 'KR2', TAXNUM: '123-45-67890', }; // XML escape helper const escapeXml = (unsafe: string) => unsafe.replace(/[<>&'"']/g, (c) => { switch (c) { case '<': return '<'; case '>': return '>'; case '&': return '&'; case '"': return '"'; case "'": return '''; default: return c; } }); export default function MDGTestPage() { const [formData, setFormData] = useState>({}); const [fieldDefs, setFieldDefs] = useState([]); const [resultXml, setResultXml] = useState(''); const [isLoading, setIsLoading] = useState(false); // CSV 로딩 및 초기 데이터 셋업 useEffect(() => { const load = async () => { const res = await fetch('/wsdl/P2MD3007_AO.csv'); const csvText = await res.text(); const defs = parseCSV(csvText); setFieldDefs(defs); const init: Record = {}; defs.forEach((d) => { init[d.name] = sampleDefaults[d.name] ?? ''; }); setFormData(init); }; load(); }, []); // 폼 데이터 업데이트 const updateField = (field: string, value: string) => { setFormData(prev => ({ ...prev, [field]: value })); }; // 기본값으로 리셋 const resetForm = () => { const reset: Record = {}; fieldDefs.forEach((d) => { reset[d.name] = sampleDefaults[d.name] ?? ''; }); setFormData(reset); toast.success('폼이 기본값으로 리셋되었습니다.'); }; // 테스트 송신 실행 const handleTestSend = async () => { try { setIsLoading(true); // 필수 필드 검증 const requiredFields = fieldDefs.filter(d => d.mandatory).map(d => d.name); const missingFields = requiredFields.filter(field => !formData[field]?.trim()); if (missingFields.length > 0) { toast.error(`필수 필드가 누락되었습니다: ${missingFields.join(', ')}`); return; } // XML 생성 const bodyContent = fieldDefs.map(f => { const val = formData[f.name] ?? ''; return `<${f.name}>${escapeXml(val)}`; }).join('\n '); const supplierXml = `\n ${bodyContent}\n `; const envelope = `\n\n \n \n \n \n ${supplierXml}\n \n \n \n`; setResultXml(envelope); toast.success('요청 XML이 생성되었습니다. 하단 영역을 확인하세요.'); } catch (error) { console.error('테스트 송신 실패:', error); toast.error('테스트 송신 중 오류가 발생했습니다.'); } finally { setIsLoading(false); } }; return (

MDG VENDOR 마스터 테스트

VENDOR 마스터 데이터를 MDG 시스템으로 테스트 송신합니다

{/* 동적 필드 렌더링 */} {fieldDefs.length === 0 ? (

CSV 로딩 중...

) : (
{Object.entries( fieldDefs.reduce((acc: Record, cur) => { acc[cur.table] = acc[cur.table] ? [...acc[cur.table], cur] : [cur]; return acc; }, {}) ).map(([table, fields]) => ( {table} {fields.some(f => f.mandatory) && ( 필수 포함 )} {table} 테이블 입력 {fields.filter((f, idx, arr) => arr.findIndex(x => x.name === f.name) === idx).map((field) => (
updateField(field.name, e.target.value)} /> {field.description && (

{field.description}

)}
))}
))}
)} {/* 송신 결과 영역 */} 송신 결과 MDG 시스템으로의 송신 결과가 여기에 표시됩니다 {resultXml ? (
              {resultXml}
            
) : (

테스트 송신 버튼을 클릭하면 결과가 표시됩니다.

)}
); }